package com.baoyouqun.base.utils;

import java.util.regex.Pattern;


/**
 * 验证手机号码是否符合特定注册要求（豹子号、顺子号等）
 */
public class PhoneNumberValidator {

    /**
     * 验证手机号是否符合注册要求
     *
     * @param phone 手机号码（可包含空格、-等分隔符）
     * @return 符合要求返回true，否则返回false
     */
    public static boolean isValidPhone(String phone) {
        // 1. 预处理：移除所有非数字字符，检查是否为11位有效手机号
        String numStr = phone.replaceAll("\\D", ""); // 只保留数字
        if (numStr.length() != 11 || !Pattern.matches("^1[3-9]\\d{9}$", numStr)) {
            return false; // 不是有效的11位手机号
        }

        // 2. 检查四个条件中的任意一个
        return checkLeopard(numStr)         // 条件1：尾号至少4位相同（豹子号）
                || checkStraight(numStr)    // 条件2：尾号至少5位顺子（顺/逆）
                || checkFourTwoPairs(numStr)// 条件3：尾号至少4对两连号（顺/逆）
                || checkTwoFourPairs(numStr);// 条件4：尾号至少2对四连号（顺/逆）
    }

    /**
     * 条件1：尾号至少4位相同（豹子号）
     * 例如：138xxxx1111（尾4位）、138xxxx55555（尾5位）
     */
    private static boolean checkLeopard(String numStr) {
        int maxContinuous = 1;
        char last = numStr.charAt(numStr.length() - 1);
        // 从倒数第二位向前检查连续相同的数字
        for (int i = numStr.length() - 2; i >= 0; i--) {
            if (numStr.charAt(i) == last) {
                maxContinuous++;
                if (maxContinuous >= 4) {
                    return true; // 找到至少4位连续相同
                }
            } else {
                last = numStr.charAt(i);
                maxContinuous = 1; // 重置计数
            }
        }
        return false;
    }

    /**
     * 条件2：尾号至少5位顺子（顺向：12345；逆向：54321）
     */
    private static boolean checkStraight(String numStr) {
        int length = numStr.length();
        // 检查所有可能的5位连续子串
        for (int i = 0; i <= length - 5; i++) {
            boolean isIncreasing = true; // 顺向（每个+1）
            boolean isDecreasing = true; // 逆向（每个-1）

            for (int j = i; j < i + 4; j++) {
                int curr = numStr.charAt(j) - '0';
                int next = numStr.charAt(j + 1) - '0';

                if (next != curr + 1) isIncreasing = false;
                if (next != curr - 1) isDecreasing = false;
                if (!isIncreasing && !isDecreasing) break; // 既不顺也不逆，跳出
            }
            if (isIncreasing || isDecreasing) {
                return true; // 找到符合条件的顺子
            }
        }
        return false;
    }

    /**
     * 条件3：尾号至少4对两连号（两连号：顺向12/逆向21，共4对即8位）
     * 例如：12121212（4对12）、21212121（4对21）
     */
    private static boolean checkFourTwoPairs(String numStr) {
        if (numStr.length() < 8) return false; // 至少需要8位尾号

        String tail = numStr.substring(numStr.length() - 8); // 取最后8位
        int validPairs = 0;

        for (int i = 0; i < 8; i += 2) { // 每2位一组，共4组
            int first = tail.charAt(i) - '0';
            int second = tail.charAt(i + 1) - '0';
            if (second == first + 1 || second == first - 1) {
                validPairs++;
            } else {
                return false; // 有一组不符合，直接返回
            }
        }
        return validPairs == 4; // 4组均符合
    }

    /**
     * 条件4：尾号至少2对四连号（四连号：顺向1234/逆向4321，共2对即8位）
     * 例如：12341234（2对1234）、43214321（2对4321）
     */
    private static boolean checkTwoFourPairs(String numStr) {
        if (numStr.length() < 8) return false; // 至少需要8位尾号

        String tail = numStr.substring(numStr.length() - 8); // 取最后8位
        String group1 = tail.substring(0, 4); // 第一组4位
        String group2 = tail.substring(4, 8); // 第二组4位

        if (!group1.equals(group2)) return false; // 两组必须相同

        // 检查组内是否为顺向或逆向四连号
        boolean isIncreasing = true;
        boolean isDecreasing = true;
        for (int i = 0; i < 3; i++) {
            int curr = group1.charAt(i) - '0';
            int next = group1.charAt(i + 1) - '0';
            if (next != curr + 1) isIncreasing = false;
            if (next != curr - 1) isDecreasing = false;
            if (!isIncreasing && !isDecreasing) break;
        }
        return isIncreasing || isDecreasing;
    }


    // 测试方法
    public static void main(String[] args) {
        // 测试用例
        String[] testPhones = {
                "13800001111", // 条件1（尾4位1111）→ 符合
                "138000023456", // 无效手机号（12位）→ 不符合
                "13812345678", // 尾5位5678（不足5位顺子）→ 不符合
                "13800012345", // 尾5位12345（顺）→ 符合条件2
                "13800054321", // 尾5位54321（逆）→ 符合条件2
                "13812121212", // 尾8位12121212（4对12）→ 符合条件3
                "13821212121", // 尾8位21212121（4对21）→ 符合条件3
                "13812341234", // 尾8位12341234（2对1234）→ 符合条件4
                "13843214321", // 尾8位43214321（2对4321）→ 符合条件4
                "13811223344", // 无符合条件 → 不符合
        };

        for (String phone : testPhones) {
            System.out.println(phone + " → " + (isValidPhone(phone) ? "符合" : "不符合"));
        }
    }
}
